package com.test09_抽象类和接口;

import org.junit.Test;

/**
 * 包装类
 */
public class YootkDemo_03 {

    @Test
    public void test1() {
        Object obj = new IntWrapper(3);
        IntWrapper iw = (IntWrapper) obj;
        System.out.println(iw.intValue());
    }

    @Test
    public void test2() {
        {
            Integer num = new Integer(3);   // 装箱
            int temp = num.intValue();  //拆箱
            System.out.println(temp * 2);
        }
        {
            // JDK1.9之后操作
            Integer num = Integer.valueOf(3);   // 装箱
            int temp = num.intValue();  //拆箱
            System.out.println(temp * 2);
        }
        {
            Double num = Double.valueOf(3);
            double temp = num.doubleValue();
            System.out.println(temp * 2);
        }
    }

    @Test
    public void test3() {
        // JDK1.5 自动装箱与拆箱
        Integer numA = 10;
        Double numB = 30.5;
        numA++;
        System.out.println(numA * numB);
    }

    @Test
    public void test4() {
        Object obj = 10.3;  // 自动由double包装为Double类实例，随后向上转型为Object
        double num = (Double) obj;  // Object必须向下转型为包装类才可以自动拆箱
        System.out.println(num * 2);
    }

    @Test
    public void test5() {
        {
            Integer numA = 127;
            Integer numB = 127;
            Integer numC = Integer.valueOf(127);
            Integer numD = new Integer(127);
            System.out.println(numA == numB);
            System.out.println(numA == numC);
            System.out.println(numA == numD);
        }
        System.out.println("======================");
        {
            // 当Integer数值超过127时，那么==就无法正确判断，必须使用equals()方法判断
            Integer numA = 128;
            Integer numB = 128;
            System.out.println(numA == numB);
            System.out.println(numA.equals(numB));
        }
    }

    /** 字符串转换为基本数据类型 */
    @Test
    public void test6() {
        {   // 数据类型转换
            int numA = Integer.parseInt("10");
            double numB = Double.parseDouble("39.9");
            boolean flag = Boolean.parseBoolean("true");
            System.out.println(numA * 2);
            System.out.println(numB * 2);
            System.out.println(flag);
        }
        System.out.println("=========================");
        {   // 错误的数据转换
            String str = "1a3";
//            int num = Integer.parseInt(str);
//            System.out.println(num);
            boolean flag = Boolean.parseBoolean(str);
            System.out.println(flag);
        }
    }

    /** 基本数据类型转换为字符串 */
    @Test
    public void test7() {
        {   // 方式1：使用+连接一个空字符串（产生垃圾）
            double num = 100.93;
            String str = num + "";
            System.out.println(str.length());
        }
        {
            // 方式2：使用String.valueOf()方法
            double num = 100.93;
            String str = String.valueOf(num);
            System.out.println(str.length());
        }
    }
}

/**
 * 自定义包装类
 */
class IntWrapper {
    private int data;   // 保存整型数据

    public IntWrapper(int data) {
        this.data = data;
    }

    public int intValue() {
        return this.data;
    }
}
